﻿using Microsoft.AspNetCore.Mvc;

namespace WMS.Models
{
    /// <summary>
    /// ControllerBase的扩展方法类，用于封装统一的API响应格式
    /// 提供成功响应、错误响应、分页响应等常用场景的响应处理
    /// </summary>
    public static class ControllerBaseExtension
    {
        /// <summary>
        /// 生成带数据的成功响应（统一格式）
        /// </summary>
        /// <param name="controller">扩展方法的调用者（ControllerBase实例，如控制器本身）</param>
        /// <param name="data">响应中需要携带的数据（可为null，如无数据时）</param>
        /// <param name="message">成功提示信息（默认值为"操作成功"）</param>
        /// <returns>封装后的IActionResult响应（HTTP状态码为200）</returns>
        public static IActionResult Success(this ControllerBase controller, object data = null, string message = "操作成功")
        {
            // 通过Ok方法返回200状态码，并封装统一格式的响应体
            return controller.Ok(new
            {
                code = 200,       // 业务状态码（成功固定为200）
                success = true,   // 成功标识（true表示成功）
                message = message,// 提示信息
                data = data       // 携带的数据
            });
        }

        /// <summary>
        /// 生成错误响应（统一格式）
        /// </summary>
        /// <param name="controller">扩展方法的调用者（ControllerBase实例，如控制器本身）</param>
        /// <param name="message">错误提示信息（默认值为"操作失败"）</param>
        /// <param name="code">错误业务状态码（默认值为500，可自定义如400、401等）</param>
        /// <returns>封装后的IActionResult响应（HTTP状态码为200，业务状态码由参数指定）</returns>
        public static IActionResult Error(this ControllerBase controller, string message = "操作失败", int code = 500)
        {
            // 通过Ok方法返回200状态码，并封装统一格式的错误响应体
            return controller.Ok(new
            {
                code = code,       // 业务错误状态码
                success = false,   // 成功标识（false表示失败）
                message = message, // 错误提示信息
                data = (object)null// 错误响应通常不带数据，固定为null
            });
        }

        /// <summary>
        /// 生成分页查询的响应（统一格式，包含分页元数据）
        /// </summary>
        /// <param name="controller">扩展方法的调用者（ControllerBase实例，如控制器本身）</param>
        /// <param name="data">当前页的分页数据（如列表集合）</param>
        /// <param name="total">总记录数（用于计算总页数）</param>
        /// <param name="page">当前页码（分页参数）</param>
        /// <param name="pageSize">每页记录数（分页参数）</param>
        /// <returns>封装后的IActionResult响应（包含分页数据和分页元信息）</returns>
        public static IActionResult PageResult(this ControllerBase controller, object data, int total, int page, int pageSize)
        {
            // 通过Ok方法返回200状态码，封装分页数据及分页元信息（总记录数、当前页、每页大小、总页数）
            return controller.Ok(new
            {
                code = 200,                          // 业务状态码（成功固定为200）
                success = true,                      // 成功标识
                message = "操作成功",                 // 固定成功提示
                data = data,                         // 当前页数据
                total = total,                       // 总记录数
                page = page,                         // 当前页码
                pageSize = pageSize,                 // 每页记录数
                totalPages = (int)Math.Ceiling(total / (double)pageSize) // 总页数（向上取整计算）
            });
        }
    }
}
